package com.springboot.ykz.dependinject;

import com.alibaba.fastjson.JSON;
import com.springboot.ykz.dependinject.config.Appconfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import javax.sound.midi.Soundbank;

public class IoCTest {
    public static void main(String[] args) {

        /*
         * 创建一个ioc容器
         *java配置文件传递参数给ioc容器的创建参数，这个配置文件就像ioc容器描述，我要装配什么bean，因为appconfig加了@bean，代表方法的返回会被加入到ioc容器中
         */
        AnnotationConfigApplicationContext ctx = null;
        try {
            ctx = new AnnotationConfigApplicationContext(Appconfig.class);
            //可以在下面这行打断点，添加@ComponentScan(value = "com.springboot.ykz",lazyInit = true)lazyInit，不会去真正的实例化bean（走不到construct方法）。注意断点执行的是断点之前的行。如果启用了lazyinit，那么会在getbean的时候去实例化。
            Person person = (Person) ctx.getBean("B_person");
            System.out.println(JSON.toJSONString(person));
            /**
             * 如果cat和dog都实现了animal，那么在此注入的时候，就会报错
             *  No qualifying bean of type 'com.springboot.ykz.dependinject.Animal' available: expected single matching bean but found 2: cat,dog
             * 	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:798)。可以采用
             * 	public BusinessPerson( @Autowired Animal animal) {
             *         this.animal=animal;
             *     }可以将animal改为cat或者dog
             */
            person.service();
        } finally {
            if (ctx != null) {
                ctx.close();
            }
        }


    }

}
